﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace Dominio
{
    [DataContract]
    public class Mensaje:ObjetoBuzon
    {
        private Carpeta carpetaPadre;

        public Carpeta CarpetaPadre
        {
            get { return carpetaPadre; }
            set { carpetaPadre = value; }
        }

        private Buzon buzonPadre;

        public Buzon BuzonPadre
        {
            get { return buzonPadre; }
            set { buzonPadre = value; }
        }

        private String asunto;

        [DataMember]
        public String Asunto
        {
            get { return asunto; }
            set { asunto = value; }
        }

        private String contenido;

        [DataMember]
        public String Contenido
        {
            get { return contenido; }
            set { contenido = value; }
        }

        private bool leido;

        [DataMember]
        public bool Leido
        {
            get { return leido; }
            set { leido = value; }
        }

        private List<Cuenta> destinatarios;

        [DataMember]
        public List<Cuenta> Destinatarios
        {
            get { return destinatarios; }
            set { destinatarios = value; }
        }

        private Cuenta remitente;

        [DataMember]
        public Cuenta Remitente
        {
            get { return remitente; }
            set { remitente = value; }
        }

        public Mensaje()
        {
            Destinatarios = null;
            Remitente = null; 
            Asunto = "";
            Leido = false;
            Contenido = "";
            CarpetaPadre = null;
            BuzonPadre = null;
            this.Agregarse();
        }

        public Mensaje(Cuenta remitente, List<Cuenta> destinatarios, String asunto, String contenido)
        {
            Destinatarios = destinatarios;
            Remitente = remitente;
            Asunto = asunto;
            Contenido = contenido;
            Leido = false;
            CarpetaPadre = null;
            this.Agregarse();
        }

        public bool EstaLeido()
        {
            return Leido;
        }

        internal void MarcarComoLeido()
        {
            Leido = true;
            this.Modificarse();
        }

        internal void MarcarComoNoLeido()
        {
            Leido = false;
            this.Modificarse();
        }

        internal void AgregarDestinatario(Cuenta destinatario)
        {
            Destinatarios.Add(destinatario);
        }

        internal void SacarDestinatario(Cuenta destinatario)
        {
            Destinatarios.Remove(destinatario);
        }

        internal override void Accept(IVisitor visitor)
        {
            visitor.VisitMensaje(this);
        }
    }
}
